home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
general
/
modelers
/
geomview
/
source.lha
/
Geomview
/
src
/
bin
/
crayola
/
common
/
callbacks.c
next >
Wrap
C/C++ Source or Header
|
1993-03-02
|
4KB
|
184 lines
#include <stdio.h>
#include <string.h>
#include "geom.h"
#include "lisp.h"
#include "pickfunc.h"
#include "crayola.h"
#include "ui.h"
Lake *lake;
static Geom *undoGeom = NULL;
static char *undoID = NULL;
static char msg[] = "callbacks.c";
#define PICK_YES "(interest (pick self))"
#define PICK_NO "(uninterest (pick self))"
void SetUndo(Geom *g, char *name) {
if (undoGeom != NULL) GeomDelete(undoGeom);
if (undoID != NULL) OOGLFree(undoID);
undoGeom = GeomCopy(g);
undoID = OOGLNewNE(char, strlen(name) + 1, msg);
strcpy(undoID, name);
}
Geom *GetObject(char *name) {
printf("(echo \"{\")");
printf("(write geometry - %s bare)", name);
printf("(echo \"}\")");
fflush(stdout);
return GeomFLoad(stdin, NULL);
}
Geom *GetTarget() {
return GetObject("targetgeom");
}
void ReplaceObject(Geom *g, char *name) {
if (g == NULL) return;
printf("(geometry %s ", name);
GeomFSave(g, stdout, NULL);
printf(")");
printf("(redraw allcams)");
fflush(stdout);
}
void ReplaceTarget(Geom *g) {
ReplaceObject(g, "targetgeom");
}
void freeze() {
uiFreeze();
printf(PICK_NO);
fflush(stdout);
}
void thaw() {
printf("(echo \"(ack)\\n\")");
fflush(stdout);
}
LDEFINE(ack, LVOID,
"(ack)\n\
Command sent back from Geomview indicating that everything has been\n\
processed")
{
LDECLARE(("ack", LBEGIN,
LEND));
printf(PICK_YES);
fflush(stdout);
uiThaw();
return Lt;
}
DEFPICKFUNC("(pick COORDSYS GEOMID G V E F P VI EI FI)",
coordsys,
id,
point, pn,
vertex, vn,
edge, en,
face, fn, 10,
ppath, ppn, 50,
vi,
ei, ein,
fi,
{
Geom *g;
ColorA color;
int setcolor = 0;
int vcolor;
int fcolor;
if (!pn) return Lt;
freeze();
g = GetObject(id);
if (uiSet() || uiSetAll()) {
if (crayHasColor(g, ppath)) {
setcolor = 1;
vcolor = fcolor = 0;
}
else {
vcolor = crayCanUseVColor(g, ppath);
fcolor = crayCanUseFColor(g, ppath);
if ((vcolor || fcolor) &&
!uiQuery("Object currently has no color",
"information. Would you",
"like to add color information to it?", "yes", "no")) {
if (vcolor && fcolor) {
vcolor = uiQuery("Would you like to color the",
"object by face or", "by vertex?",
"By Face", "By Vertex");
fcolor = vcolor ? 0 : 1;
}
setcolor = 1;
}
}
if (setcolor) {
uiCurrentColor(&color);
SetUndo(g, id);
if (vcolor) crayUseVColor(g, &crayDefColor, ppath);
else if (fcolor) crayUseFColor(g, &crayDefColor, ppath);
if (uiSetAll()) craySetColorAll(g, &color, ppath);
else craySetColorAt(g, &color, vi, fi, ei, ppath, &vertex);
ReplaceObject(g, id);
}
}
else if (uiGet() && crayGetColorAt(g, &color, vi, fi, ei, ppath, &vertex))
uiChangeColor(&color);
else if (uiEliminateColor()) {
SetUndo(g, id);
if (crayEliminateColor(g, ppath)) ReplaceObject(g, id);
}
GeomDelete(g);
thaw();
return Lt;
})
void init() {
crayolaInit();
LInit();
LDefun("pick", Lpick, Hpick);
LDefun("ack", Lack, Hack);
lake = LakeDefine(stdin, stdout, NULL);
printf(PICK_YES);
fflush(stdout);
uiChangeColor(&crayDefColor);
}
void dopipes() {
LObject *lit, *val;
lit = LSexpr(lake);
val = LEval(lit);
LFree(lit);
LFree(val);
}
void checkpipes() {
if (async_fnextc(stdin, 0) != NODATA) dopipes();
else {
static struct timeval tenth = { 0, 100000 };
select(0, NULL, NULL, NULL, &tenth);
}
}
int undo() {
if (undoGeom != NULL) {
ReplaceObject(undoGeom, undoID);
return 1;
} else return 0;
}
void quit() {
if (undoGeom != NULL) GeomDelete(undoGeom);
if (undoID != NULL) OOGLFree(undoID);
exit(0);
}